package com.cos.utils.obj;

import com.cos.config.COSConfig;
import com.cos.config.cons.ConstantAttribute;
import com.cos.config.thread.pool.COSTaskThreadPool;
import com.qcloud.cos.COSClient;
import com.qcloud.cos.model.PutObjectRequest;
import com.qcloud.cos.transfer.TransferManager;
import com.qcloud.cos.transfer.TransferManagerConfiguration;
import com.qcloud.cos.transfer.Upload;
import com.cos.config.thread.task.UDTransferProgress;

import java.io.File;
import java.util.concurrent.*;

/**
 * @author Irving
 * @create 2021/7/16
 * @desc 上传
 **/
public class COSObjectUpload {

    /**
     * 推荐
     * 上传本地文件,不限制大小,分块上传
     *
     * @param bucketName    存储桶
     * @param localFilePath 本地文件地址
     * @param fileName      文件名
     */
    public void upload(StringBuffer bucketName, String localFilePath, String fileName) throws InterruptedException {
        //如果没有指定用户名,那么就默认为原来的名字
        if (fileName == null) {
            int beginIndex = localFilePath.lastIndexOf(File.separator) + 1;
            int endIndex = localFilePath.lastIndexOf(".");
            fileName = localFilePath.substring(beginIndex, endIndex);
            System.out.println(fileName);
        }
        COSConfig config = new COSConfig();
        COSClient client = config.getCosClient();
        //线程池大小，建议在客户端与 COS 网络充足（例如使用腾讯云的 CVM，同地域上传 COS）的情况下，设置成16或32即可，可较充分的利用网络资源
        //对于使用公网传输且网络带宽质量不高的情况，建议减小该值，避免因网速过慢，造成请求超时。
        ExecutorService threadPool = Executors.newFixedThreadPool(ConstantAttribute.COS_UP_THREAD_POOL_SIZE);
        // 传入一个 threadPool, 若不传入线程池，默认 TransferManager 中会生成一个单线程的线程池。
        TransferManager transferManager = new TransferManager(client, threadPool);
        // 设置高级接口的分块上传阈值和分块大小为10MB
        TransferManagerConfiguration transferManagerConfiguration = new TransferManagerConfiguration();
        transferManagerConfiguration.setMultipartUploadThreshold(ConstantAttribute.COS_UP_THRESHOLD);
        transferManagerConfiguration.setMinimumUploadPartSize(ConstantAttribute.COS_UP_PART_SIZE);
        transferManager.setConfiguration(transferManagerConfiguration);
        PutObjectRequest putObjectRequest = new PutObjectRequest(config.generateBucketId(bucketName), fileName, new File(localFilePath));
        // 本地文件上传
        Upload upload = transferManager.upload(putObjectRequest);
        // 同步打印上传进度,这里使用线程池异步打印进度
        COSTaskThreadPool.threadPoolExecutor.execute(new UDTransferProgress(upload));
        // 等待传输结束
        upload.waitForUploadResult();
        //关闭传输,底层也关闭了CosClient
        transferManager.shutdownNow();
    }

}
